Table des matières
firewalld - Le pare-feu facile sous Linux
Informations générales sur firewalld
Lister le paramétrage des zones
Affecter des zones aux interfaces
Affecter des zones aux sources (sous-réseau / IP)
Créer, exporter et importer des services personnalisés (à venir)
firewalld : Autoriser des services et des ports dans le pare-feu
Autoriser ou retirer des services
Lister les services autorisés dans une zone
Autoriser ou retirer des ports et protocoles
Lister les ports autorisés dans une zone
firewalld : Opérations avancées
firewalld : Export et Import de la config
Après avoir installé le pare-feu, celui-ci est lancé en tant que service :
Sous systemd :
Code BASH :
systemctl status firewalld
Sous OpenRC :
Code BASH :
/etc/init.d/firewalld status
Firewalld prévoit une commande pour vérifier son statut :
Code BASH :
firewall-cmd --state
Si la commande renvoie running c'est que le pare-feu est en fonctionnement.
La commande permettant de gérer firewalld s'appelle firewall-cmd.
Firewalld est gérable en graphique avec firewall-config
Firewalld est gérable en interface web si Cockpit est installé sur a machine (utile pour les serveurs)
Concernant le comportement de la commande firewall-cmd
Une commande du style :
Code BASH :
firewall-cmd --add-port=22/tcp
Prendra effet dès la validation. Cependant, si le parefeu est redémarré ou la configuration rechargée, la commande n'est pas mémorisée. Il faudra pour cela ajouter l'option --permanent à la commande :
Code BASH :
firewall-cmd --add-port=22/tcp --permanent
L'option --permanent permet de rendre permanente la configuration, mais ne prend effet qu'après avoir rechargé la configuration du parefeu. Pour recharger la configuration du pare-feu :
Code BASH :
firewall-cmd --reload
Donc dans la suite de cet article, je préciserai avec [--permanent] en fin de ligne les commandes supportant cette option.
Vous aurez donc compris que sans, la règle s'applique de suite mais de manière éphémère, et qu'avec il est nécessaire de recharger la configuration du pare-feu après.
Firewalld fonctionne avec la notion de zone. Avant de savoir quelle zone on utilise et comment les changer et les gérer, je vous explique rapidement les zones existantes. Chaque zone dispose de règles et de comportements par défaut.
Pour voir la liste des zones créées sur la machine, on utilisera
Code BASH :
firewall-cmd --get-zones
Voici une explication concernant les différentes zones :
- drop : Niveau de confiance minimal. Toute connexion entrante est ignorée (sans notification) et les connexions sortantes sont autorisées
- block : Niveau de confiance minimal. Toute connexion entrante est ignorée (avec notification icmp-host-prohibited ou icmp6-adm-prohibited) et les connexions sortantes sont autorisées
- public : Niveau de confiance bas (zone par défaut sous CentOS) : Certaines connexions entrantes sont acceptées (ssh par exemple) et on peut en ajouter à la demande à l'aide des règles.
- external : Zone dans laquelle on va placer une interface reliée à une réseau externe (WAN par exemple) quand on utilise le serveur comme passerelle. Le MASQUERADE NAT (qu'on connait dans iptables) est activé.
- internal : Zone de l'autre côté de l'external quand on utilise le serveur comme passerelle. Cette zone est de bonne confiance, et on peut éditer les services acceptés avec des règles.
- dmz : Zone réservée pour les serveurs étant dans une DMZ (zone démilitarisée). Quelques connexions entrantes sont autorisées.
- work : Niveau de confiance bonne : Zone utilisée pour les machines de travail, La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- home : Niveau de confiance bonne : Zone utilisée pour une zone personnelle. La plupart des connexions entrantes sont autorisées, et on peut éditer les services acceptés avec des règles.
- trusted : Niveau de confiance élevée : Zone utilisée pour les machines qui se font 100% confiance. A utiliser avec précaution évidemment.
On peut évidemment créer des zones personnalisées.
Pour voir la liste des zones créées sur la machine, on utilisera
Code BASH :
firewall-cmd --get-zones
Pour lister toutes les zones et leur paramétrage actuel, on utilisera :
Code BASH :
firewall-cmd --list-all-zones
Pour lister le paramétrage actuel d'une zone :
Code BASH :
firewall-cmd --info-zone lazone
Exemple avec la zone public :
Code BASH :
# firewall-cmd --info-zone public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client http https mdns ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
On peut créer sa propre zone, par exemple ici avec la zone "mesvps" :
Code BASH :
firewall-cmd --new-zone=mesvps --permanent
firewall-cmd --reload
Le paramétrage de la zone est vide par défaut
On peut supprimer des zones personnalisée avec :
Code BASH :
firewall-cmd --delete-zone=mazone --permanent
firewall-cmd --reload
Par défaut, quand la commande firewall-cmd est invoquée, la règle s'applique à la zone par défaut.
Pour vérifier la zone utilisée par défaut :
Code BASH :
firewalld-cmd --get-default-zone
Et pour définir une autre zone par défaut (exemple avec une définition de la zone par défaut sur work) :
Code BASH :
firewall-cmd --set-default-zone=work
Chaque interface du système peut être attribuée à une zone.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour ajouter l'interface ens192 à la zone work en l'enlevant de sa précédente zone :
Code BASH :
firewall-cmd --change-interface=ens192 --zone=work [--permanent]
Pour retirer l'interface ens192 de la zone work :
Code BASH :
firewall-cmd --remove-interface=ens192 --zone=work [--permanent]
Pour ajouter l'interface ens192 à la zone work (interface qui ne soit pas âtre affectée à une zone) :
Code BASH :
firewall-cmd --add-interface=ens192 --zone=work [--permanent]
On peut affecter des interfaces à des zones, mais aussi des sources.
Quand on ne dispose que d'une seule interface, il peut être utile de définir par exemple la zone public par défaut, mais la zone work pour un sous-réseau et/ou la zone trusted pour une machine spécifique.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work :
Code BASH :
firewall-cmd --zone=work --add-source=192.168.21.0/24 [--permanent]
Pour ajouter une IP seule (192.168.21.200) à la zone trusted :
Code BASH :
firewall-cmd --zone=work --add-source=192.168.21.200 [--permanent]
Pour retirer le sous-réseau 192.168.21.0/24 de la zone work :
Code BASH :
firewall-cmd --zone=work --remove-source=192.168.21.0/24 [--permanent]
Pour ajouter le sous-réseau 192.168.21.0/24 à la zone work en l'enlevant de sa précédente zone :
Code BASH :
firewall-cmd --zone=work --change-source=192.168.21.0/24 [--permanent]
Firewalld dispose de services préconfigurés. Ainsi, il sera plus facile d’ouvrir un port et un protocole grâce à son nom.
Pour lister les services préinstallés :
Code BASH :
firewall-cmd --get-services
On remarque par exemple le service "ssh". Pour avoir des infos sur le service :
Code BASH :
firewall-cmd --info-service ssh
On voit que ce service correspond au port 22 en TCP.
Code TEXT :
ssh
ports: 22/tcp
protocols:
source-ports:
modules:
destination:
includes:
A venir
Le titre est assez simpliste. Si je voulais être complet, je dirais plutôt : Autoriser un service ou un port dans une zone.
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Si on veut autoriser le service http :
Code BASH :
firewall-cmd --add-service=http [--permanent]
Si on veut retirer le service http :
Code BASH :
firewall-cmd --remove-service=http [--permanent]
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour lister les services autorisés dans une zone (exemple avec la zone work) :
Code BASH :
firewall-cmd --list-services --zone work
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Si on veut autoriser un port, il faut spécifier le port ET le protocole utilisé (Exemple Port 1234 en TCP ) :
Code BASH :
firewall-cmd --add-port=1234/udp [--permanent]
On peut aussi autoriser une plage de ports (Exemple ici d'un serveur avec plusieurs sessions VNC, des ports 5900 à 5950 en TCP ) :
Code BASH :
firewall-cmd --add-port=5900-5950/tcp [--permanent]
Si on ne précise pas le --zone=lazone la commande s'effectuera sur la zone par défaut.
Pour lister les services autorisés dans une zone (exemple avec la zone work) :
Code BASH :
firewall-cmd --list-ports --zone work
Grâce à firewalld, on peut transférer des requêtes d'un port sur un autre port. Ou même de transférer une requête d'un port sur une autre IP et un autre port.
Dans ce cas, les zones external/internal sont bonnes.
Voici la syntaxe à utiliser :
Code BASH :
firewall-cmd --zone=external --add-forward-port=port=:proto=:toaddr=:toport= [--permanent]
Voici un exemple avec un NAT/PAT du port HTTP vers l'IP 172.21.21.10 :
Code BASH :
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=172.21.21.10:toport=80 --permanent
Il peut être utile d'exporter la config du pare-feu pour la réimporter (sauvegarde, import dans une nouvelle machine)..
La conf se trouve dans /etc/firewalld. Il suffit de sauvegarder ces fichiers.
firewalld.conf : Fichier principal de conf, à garder si modifié.
zones : Dossier contenant la confg des zones.
Les dossiers helpers icmptypes ipsets et services sont vides si vous ne créez pas vous même ces éléments.